#include "ArchivoRepositorios.h"

ArchivoRepositorios::ArchivoRepositorios(const char* filename):Archivo(filename) {
	this->filename = filename;
	this->r.clear();
	this->load();
}

void ArchivoRepositorios::add(string rep, uint16_t dimension) {
	Repositorio *r = new Repositorio();
	r->setNombre(rep);
	r->setDimension(dimension);

	this->r.push_back(r);
	sort(this->r.begin(), this->r.end());
}

void ArchivoRepositorios::load() {
	while (!this->eof()) {
		Repositorio *r = new Repositorio();
		unsigned short int numBytes;

		this->read((char*) &numBytes, sizeof(unsigned short int));
		this->read((char*) &r, numBytes);

		this->r.push_back(r);
	}
}

void ArchivoRepositorios::save() {
	remove(this->filename);
	this->open(filename, ios::out | ios::binary);

	vector<Repositorio*>::iterator it = this->r.begin();
	unsigned int numBytes;
	for (; it != r.end(); ++it) {
		Repositorio* rep = *it;
		numBytes = rep->getNombre().length() + sizeof(uint16_t);

		this->write((char*) &numBytes, sizeof(unsigned short int));
		this->write((char*) rep, numBytes);
	}
}

uint16_t ArchivoRepositorios::getDimension(string rep) {
	vector<Repositorio*>::iterator it = this->r.begin();

	for (; it != r.end(); ++it) {
		Repositorio* r = *it;
		if (r->getNombre() > rep)
			return 0;
		if (r->getNombre().compare(rep) == 0) {
			return r->getDimension();
		}
	}

	return 0;
}

ArchivoRepositorios::~ArchivoRepositorios() {
	this->save();
	this->close();
}
